import pandas as pd
import re
from datetime import datetime
from scraper.option_value_analysis_em import fetch_all_option_value
from analysis.option_value_risk_analysis import calculate_option_margin

# =====================
# 正向平价套利分析脚本
# 成本计算方式：
# 标的最新价*10000 + 认购期权保证金 + (- 认购期权价格+认沽期权价格)*10000 + 3.5(期权交易费)

# 收益计算方式：
# (认购期权价格-认沽期权价格+行权价-标的最新价)*10000

# 功能说明：
# 1. 获取所有期权的实时行情数据。
# 2. 提取期权行权价、类型等关键信息。
# 3. 计算认购期权保证金。
# 4. 对同一标的、同一到期日、同一行权价的认购和认沽进行配对，判断是否存在正向套利机会。
# 5. 按照合成股票价、套利成本、收益、收益率、年化收益率等维度输出结果，并排序。
# 6. 结果保存到csv文件。
# =====================

# 提取期权行权价的正则表达式
# 期权名称如：300ETF沽12月4600，提取4600/1000=4.6
STRIKE_PATTERN = re.compile(r"([沽购])(\d{1,2})月(\d{3,4})")


def extract_strike_price(option_name: str) -> float:
    """
    从期权名称中提取行权价（如“300ETF沽12月4600”提取为4.6）
    """
    match = STRIKE_PATTERN.search(option_name)
    if match:
        strike = float(match.group(3)) / 1000.0
        return strike
    return -1.0


def extract_option_type(option_name: str) -> str:
    """
    判断期权类型（认购/认沽）
    """
    if '购' in option_name:
        return '认购'
    elif '沽' in option_name:
        return '认沽'
    else:
        return ''


def forward_arbitrage_analysis():
    """
    主函数：执行正向平价套利分析
    """
    # 1. 获取所有期权行情数据
    df = fetch_all_option_value()
    # 2. 提取行权价和期权类型
    df['行权价'] = df['期权名称'].apply(extract_strike_price)
    df['期权类型'] = df['期权名称'].apply(extract_option_type)

    # 3. 只保留分析所需的主要字段
    useful_cols = [
        '期权代码', '期权名称', '期权类型', '行权价', '最新价', '理论价格', '标的代码', '标的名称', '标的最新价', '到期日'
    ]
    df = df[useful_cols]

    # 4. 计算认购期权保证金（调用已有分析模块）
    margin_df = calculate_option_margin(df.copy())
    df['券商开仓保证金'] = margin_df['券商开仓保证金'] if '券商开仓保证金' in margin_df.columns else 0

    # 5. 正向平价套利分析
    #    对每组（同标的、同到期日、同行权价）认购+认沽配对，判断是否存在套利空间
    result = []
    grouped = df.groupby(['标的代码', '到期日', '行权价'])
    for (underlying, expiry, strike), group in grouped:
        # 必须同时有认购和认沽才配对
        if group['期权类型'].nunique() == 2:
            call = group[group['期权类型'] == '认购'].iloc[0]
            put = group[group['期权类型'] == '认沽'].iloc[0]
            # 合成股票价格 = 行权价 + 认购期权价格 - 认沽期权价格
            synthetic_stock_price = round(strike + call['最新价'] - put['最新价'], 4)
            # 只有合成股票价高于标的现价，才有正向套利空间
            if synthetic_stock_price > call['标的最新价']:
                # 套利总成本 = 标的现价*10000 + 认购期权保证金 + (-认购期权价+认沽期权价)*10000 + 3.5（手续费）
                cost = round(call['标的最新价'] * 10000 + call['券商开仓保证金'] + (-call['最新价'] + put['最新价']) * 10000 + 3.5, 2)
                # 套利收益 = (认购期权价-认沽期权价+行权价-标的现价)*10000
                profit = round((call['最新价'] - put['最新价'] + strike - call['标的最新价']) * 10000, 2)
                # 收益率（百分比）
                avg_profit = round((profit / cost * 100) if cost != 0 else 0, 2)
                # 年化收益率 = 收益率 * 365 / 剩余天数
                today = datetime.now().date()
                expiry_date = pd.to_datetime(expiry).date() if not pd.isnull(expiry) else today
                days = (expiry_date - today).days
                annualized = round(avg_profit * 365 / days, 2) if days > 0 else 0
                result.append({
                    '标的代码': underlying,
                    '到期日': expiry,
                    '行权价': strike,
                    '认购代码': call['期权代码'],
                    '认购名称': call['期权名称'],
                    '认购最新价': call['最新价'],
                    '认购保证金': call['券商开仓保证金'],
                    '认沽代码': put['期权代码'],
                    '认沽名称': put['期权名称'],
                    '认沽最新价': put['最新价'],
                    '标的最新价': call['标的最新价'],
                    '合成股票价': synthetic_stock_price,
                    '套利成本': cost,
                    '套利收益': profit,
                    '正向收益率(%)': avg_profit,
                    '年化收益率(%)': annualized
                })
    # 6. 结果整理与输出
    result_df = pd.DataFrame(result)
    # 按年化收益率倒序排序，优先关注高收益套利机会
    if not result_df.empty:
        result_df = result_df.sort_values(by='年化收益率(%)', ascending=False)
    print(result_df)
    # 保存到csv文件
    result_df.to_csv('../result/option_forward_arbitrage_analysis.csv', index=False, encoding='utf-8-sig')


if __name__ == '__main__':
    # 入口：执行正向平价套利分析
    forward_arbitrage_analysis()
